﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.DataVisualization.Charting;
using System.Web.UI.WebControls;

namespace FrontEndPlus.Módulos.RRHH
{
    public partial class wbfrm_Control_Vacaciones : System.Web.UI.Page
    {
        #region Variables

        private WCF_Gimnasio.cls_Solicitud_Vacacion _solicitudVacacion = new WCF_Gimnasio.cls_Solicitud_Vacacion();

        #endregion

        #region Metodos

        private void CargarRegistroCompletoEmpleados()
        {
            using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
            {
                ViewState["RegistroCompletoEmpleados"] = servicio.Listar(1, _solicitudVacacion).Tables[0];
            }
        }

        private void CargarDatosEmpleado(string cedula)
        {
            using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
            {
                _solicitudVacacion.Filtros[0] = cedula;
                ViewState["InformacionEmpleado"] = servicio.Listar(2, _solicitudVacacion).Tables[0];
            }
        }

        private void CargarGraficoEmpleado()
        {
            DataTable informacionEmpleado = (DataTable)ViewState["InformacionEmpleado"];

            ch_frecuencia_Vacaciones.DataSource = informacionEmpleado;
            ch_frecuencia_Vacaciones.DataBind();

            string[] x = new string[informacionEmpleado.Rows.Count];
            int[] y = new int[informacionEmpleado.Rows.Count];
            for (int i = 0; i < informacionEmpleado.Rows.Count; i++)
            {
                x[i] = string.Format("{0} {1}", informacionEmpleado.Rows[i][5].ToString(), informacionEmpleado.Rows[i][6].ToString());
                y[i] = Convert.ToInt32(informacionEmpleado.Rows[i][0]);
            }

            ch_frecuencia_Vacaciones.Series[0].Points.DataBindXY(x, y);
            ch_frecuencia_Vacaciones.Series[0].ChartType = SeriesChartType.Pie;
            ch_frecuencia_Vacaciones.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = true;
        }

        private void AprobacionVacaciones()
        {
            DataTable informacionEmpleado = (DataTable)ViewState["InformacionEmpleado"];

            if (informacionEmpleado != null)
            {
                object resultado = false;
                if (informacionEmpleado.Rows.Count != 0)
                {
                    _solicitudVacacion.IdEmpleado = Convert.ToInt32(informacionEmpleado.Rows[0][0].ToString());

                    using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
                    {
                        servicio.OtrosProcesos(1, ref resultado, _solicitudVacacion);
                    }

                    if ((bool)resultado)
                    {
                        cl_periodo_Inicio.SelectedDate = DateTime.Now;
                        cl_periodo_Final.SelectedDate = DateTime.Now;

                        Session["EstadoVacaciones"] = true;
                    }

                    else
                    {
                        cl_periodo_Inicio.SelectedDate = (DateTime)informacionEmpleado.Rows[0][5];
                        cl_periodo_Final.SelectedDate = (DateTime)informacionEmpleado.Rows[0][6];

                        Session["EstadoVacaciones"] = false;
                    }
                }
            }
        }

        #endregion

        #region Eventos

        protected void Page_Load(object sender, EventArgs e)
        {
            _solicitudVacacion.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
            _solicitudVacacion.Filtros = new string[2];

            if (!IsPostBack)
            {
                object resultado = string.Empty;
                using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
                {
                    servicio.OtrosProcesos(2, ref resultado, _solicitudVacacion);
                }

                CargarRegistroCompletoEmpleados();
            }

            ltv_informacion_Basica_Empleado.DataSource = (DataTable)ViewState["RegistroCompletoEmpleados"];
            ltv_informacion_Basica_Empleado.DataBind();
        }

        protected void ltv_informacion_Basica_Empleado_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            Label lbl_cedula = ltv_informacion_Basica_Empleado.Items[e.Item.DisplayIndex].FindControl("lbl_cedula") as Label;
            Label lbl_estado = ltv_informacion_Basica_Empleado.Items[e.Item.DisplayIndex].FindControl("lbl_estado") as Label;

            CargarDatosEmpleado(lbl_cedula.Text);

            DataTable informacionEmpleado = (DataTable)ViewState["InformacionEmpleado"];

            if (informacionEmpleado != null)
            {
                if (informacionEmpleado.Rows.Count != 0)
                {
                    frmvw_informacion_Completa_Empleado.DataSource = informacionEmpleado;
                    frmvw_informacion_Completa_Empleado.DataBind();

                    AprobacionVacaciones();
                    CargarGraficoEmpleado();
                    
                    if (lbl_estado.Text == "EN PROGRESO")
                    {
                        pnl_periodos_Vacaciones.Visible = true;
                        lbl_mensaje_Error_Periodo.Visible = false;

                        btn_aprobar_Vacaciones.Visible = true;
                    }

                    else
                    {
                        pnl_periodos_Vacaciones.Visible = false;
                        lbl_mensaje_Error_Periodo.Visible = true;

                        btn_aprobar_Vacaciones.Visible = false;
                    }
                }
            }

            mpe_informacion_Completa.Show();
        }

        protected void txt_periodo_Inicio_TextChanged(object sender, EventArgs e)
        {
            if (DateTime.Now.AddMonths(-1).Month == DateTime.Parse(txt_periodo_Inicio.Text).Month)
            {
                txt_periodo_Inicio.Text = DateTime.Now.Date.ToShortDateString();
            }

            else
            {
                string script = "<script type='text/javascript'> smoke.alert('No se puede asignar las vacaciones un mes anterior.', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);
            }

            mpe_informacion_Completa.Show();
        }

        protected void txt_periodo_Final_TextChanged(object sender, EventArgs e)
        {
            DateTime periodoInicio = Convert.ToDateTime(txt_periodo_Inicio.Text);
            DateTime periodoFinal = Convert.ToDateTime(txt_periodo_Final.Text);

            TimeSpan diferenciaDias = periodoFinal.Subtract(periodoInicio);

            lbl_saldo_Vacaciones.Text = diferenciaDias.Days.ToString();

            if (DateTime.Now.AddMonths(-1).Month == DateTime.Parse(txt_periodo_Final.Text).Month)
            {
                txt_periodo_Final.Text = DateTime.Now.Date.ToShortDateString();
            }

            else
            {
                string script = "<script type='text/javascript'> smoke.alert('No se puede asignar las vacaciones un mes anterior.', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);
            }

            mpe_informacion_Completa.Show();
        }

        protected void btn_aprobar_Vacaciones_Click(object sender, EventArgs e)
        {
            if (Convert.ToBoolean(Session["EstadoVacaciones"]))
            {
                DataTable informacionEmpleado = (DataTable)ViewState["InformacionEmpleado"];

                if (DateTime.Parse(txt_periodo_Inicio.Text) >= DateTime.Now.Date && DateTime.Parse(txt_periodo_Final.Text) > DateTime.Now.Date)
                {
                    if (DateTime.Parse(txt_periodo_Inicio.Text).Date < DateTime.Parse(txt_periodo_Final.Text).Date && DateTime.Parse(txt_periodo_Inicio.Text).Date != DateTime.Parse(txt_periodo_Final.Text).Date)
                    {
                        if (informacionEmpleado.Rows[0][7].ToString() == "Activo")
                        {
                            if (lbl_saldo_Vacaciones.Text == "0")
                            {
                                using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
                                {
                                    _solicitudVacacion.IdEmpleado = Convert.ToInt32(informacionEmpleado.Rows[0][0].ToString());
                                    _solicitudVacacion.InicioPeriodo = Convert.ToDateTime(txt_periodo_Inicio.Text);
                                    _solicitudVacacion.FinalPeriodo = Convert.ToDateTime(txt_periodo_Final.Text);
                                    _solicitudVacacion.IdEstadoVaciones = 4;

                                    string mensajeError = string.Empty;
                                    servicio.InsertarActualizarRegistro(true, ref mensajeError, _solicitudVacacion);
                                }
                            }

                            else
                            {
                                string script = "<script type='text/javascript'> smoke.alert('Debe completar todo el perido de vacaciones.\nPor favor vuelva intentarlo.', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                                ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);
                            }
                        }

                        else
                        {
                            string script = "<script type='text/javascript'> smoke.alert('El personal seleccionado, ya le fueron asignado un periodo de vacaciones.\nPor favor vuelva intentarlo.', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                            ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);
                        }
                    }

                    else
                    {
                        string script = "<script type='text/javascript'> smoke.alert('El periodo seleccionado es incorrecto, el rango debe estar entra la Fecha de Inicio y Final.\nPor favor vuelva intentarlo.', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);
                    }
                }

                else
                {
                    string script = "<script type='text/javascript'> smoke.alert('El periodo seleccionado es incorrecto, el rango debe estar entra la Fecha de Inicio y Final.\nPor favor vuelva intentarlo.', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);
                }
            }

            else
            {
                string script = "<script type='text/javascript'> smoke.alert('El personal seleccionado, ya le fueron asignado un periodo de vacaciones.\nPor favor vuelva intentarlo.', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);
            }
        }

        #endregion

    }
}